package main

import "fmt"

func main() {
	/*数组
	数组是长度固定的数据类型，元素的类型都是一样的，数组在内存当中是连续的存储空间，可以有效的提升cpu的执行效率。
	变量或者说数组在定义时，如果没有赋值，会有默认值，零值
	整型：默认值0
	字符串：默认值 ""
	bool:默认值 false
	数组下标从0开始
	数组的长度len(arr)
	*/
	//数组的定义方式1
	var arrayVariables [10]int

	arrayVariables[0] = 100
	arrayVariables[9] = 100

	//arrayVariables[10] = 100就会越界
	fmt.Println(arrayVariables)

	arrayVariables2 := [5]int{1, 2, 0, 0, 0}
	for i, v := range arrayVariables2 {
		fmt.Printf("arrayVariables2[%d]=%d,地址=%p\n", i, v, &arrayVariables2[i])
	}

	/*
		数组在内存当中是连续的存储空间
		数组的元素(下标)      元素值		元素的地址
		0					1			0xc00006a060
		1					2			0xc00006a068
		2					3		    0xc00006a070
		3					4	        0xc00006a078
		4					5	        0xc00006a080

	*/

	//数组定义方式2
	//Cannot use '[...]int{1,2,3,4,5}' (type [5]int) as type [10]int in assignment
	//[10]int [5]int 被认为是不同的类型
	//数组的长度是数组类型的组成部分
	arrayVariables3 := [...]int{1, 2, 3, 4, 5}
	fmt.Println(arrayVariables3, len(arrayVariables3))

	//数组定义方式3
	arrayVariables4 := [...]int{100: 200, 300: 500}
	fmt.Println(len(arrayVariables4), arrayVariables4)

	//在go语言中数组是值类型,所以在函数中作为参数，进行修改是无效的
	arrayVariables5 := [10]int{1, 2, 3}
	fmt.Println(arrayVariables5)
	changeArr(arrayVariables5)
	fmt.Println(arrayVariables5)

	//通过传递指针的方式来改变数组的元素
	changeArrByPointer(&arrayVariables5)
	fmt.Println(arrayVariables5)
	/*
		A{dataA}
		->B {dataB}
	*/

	//将一个数组赋值给另一个数组
	arrayVariables6 := [3]string{"波哥", "哥波", "golang"}
	arrayVariables7 := arrayVariables6
	//for .. rage
	for key, value := range arrayVariables6 {
		fmt.Printf("arrayVariables6[%d]=%v,地址=%p\n", key, value, &arrayVariables6[key])
	}
	for key, value := range arrayVariables7 {
		fmt.Printf("arrayVariables7[%d]=%v,地址=%p\n", key, value, &arrayVariables6[key])
	}

	//二维数组,两个维度
	var arrayVariables8 [4][2]int
	fmt.Println(arrayVariables8)

	arrayVariables9 := [4][2]int{{10, 11}, {3, 5}, {2, 3}, {100, 88}}
	fmt.Println(arrayVariables9)

	arrayVariables10 := [4][2]int{1: {100, 90}, 2: {8, 9}}
	fmt.Println(arrayVariables10)

	//多维数组
	var arrayVariables11 [4][3][2]int = [4][3][2]int{}
	fmt.Println(arrayVariables11)

}

func changeArrByPointer(arr *[10]int) {
	(*arr)[0] = 100
}
func changeArr(arr [10]int) {
	arr[0] = 100
}
